/**
 * 
 */
package cn.edu.hstc.ui;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.http.AndroidHttpClient;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.format.DateFormat;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RadioGroup;
import android.widget.Toast;
import android.widget.RadioGroup.OnCheckedChangeListener;
import cn.edu.hstc.R;
import cn.edu.hstc.app.App;
import cn.edu.hstc.app.AppConfig;
import cn.edu.hstc.bean.User;
import cn.edu.hstc.bean.utils.UserUtils;
import cn.edu.hstc.common.AppUtils;
import cn.edu.hstc.common.HttpUtils;
import cn.edu.hstc.common.HttpUtils4Jwgl;
import cn.edu.hstc.common.L;
import cn.edu.hstc.common.StringUtils;

/**
 * @Description 教务系统登录界面
 * @author act262
 * @version 1.0
 * @since 2014-4-29 上午11:19:43
 * 
 */
public class LoginJwgl extends BaseActivity {

	public static final String ACCOUNT = "account";
	public static final String PASSWD = "password";
	public static final String REMEMBER = "remember";

	/** 第一次连接教务系统后产生的一段随机安全码(24位) */
	public static String randomUrl = "";
	/** login action */
	public static final String LOGIN_TYPE_INTENT = "cn.edu.hstc.intent.action.LOGIN_JWGL_TYPE";

	/**
	 * 使用登录的来源类型
	 */
	public enum LoginType {
		/** 教务系统 */
		Jwgl,
		/** 失物招领 */
		Swzl,
		/** 图书馆 */
		Lib;
	}

	/** 全局唯一的上下文 */
	Context mContext;

	/** AndroidHttpClient 自动管理线程池 */
	AndroidHttpClient mHttpClient = null;

	/** 输入账号,输入密码,输入验证码 */
	private EditText accountText, passwordText, checkcodeText;
	/** 显示的验证码 */
	private ImageView checkcodeView;

	/** 选择登录用户类型 :教师,学生,访客 */
	private RadioGroup loginUserType;
	private String userType = "学生";
	/** 记住用户复选框 */
	private CheckBox remenberUser;
	/** 自动登录复选框 */
	private CheckBox autoLogin;

	private Handler mHandler;
	private final int CHECKCODE_STATUS_GET_FAIL = 0x00; // 获取失败
	private final int CHECKCODE_STATUS_PARSE_FAIL = 0x01; // 解析失败
	private final int CHECKCODE_STATUS_OK = 0x02; // 获取成功并解析

	/** 登录状态结果 */
	private final int LOGIN_RESULT_OK = 0x10;
	private final int LOGIN_RESULT_FAIL = 0x11;
	private final int LOGIN_RESULT_FAIL_CHECKCODE = 0x12;
	private final int LOGIN_RESULT_FAIL_ACCOUNT = 0x13;
	private final int LOGIN_RESULT_FAIL_PASSWORD = 0x14;
	private final int LOGIN_RESULT_FAIL_SERVICE_BUSY = 0x15;

	private final String TAG = LoginJwgl.class.getSimpleName();

	@SuppressLint("NewApi")
	public void onCreate(Bundle bundle) {
		super.onCreate(bundle);
		setContentView(R.layout.login_jwgl);
		L.d(TAG, "onCreate" + getTaskId());

		mContext = getApplicationContext();

		// 使用线程政策模式
		// StrictMode.ThreadPolicy policy = new
		// StrictMode.ThreadPolicy.Builder().permitAll().build();
		// StrictMode.setThreadPolicy(policy);

		// StrictMode.setThreadPolicy(new
		// StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork()
		// // 这里可以替换为detectAll()
		// // 就包括了磁盘读写和网络I/O
		// .penaltyLog() // 打印logcat，当然也可以定位到dropbox，通过文件保存相应的log
		// .build());
		// StrictMode.setVmPolicy(new
		// StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects() //
		// 探测SQLite数据库操作
		// .penaltyLog() // 打印logcat
		// .penaltyDeath().build());

		initHandler();
		initView();
		initConn();
		initInfo();
	}

	public void onDestroy() {

		L.d(TAG, "onDestroy");

		// 关闭连接,释放资源
		if (null != mHttpClient) {
			mHttpClient.close();
		}
		super.onDestroy();
	}

	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		L.d(TAG, "onSaveInstanceState");
	}

	private void initHandler() {
		mHandler = new Handler() {
			public void handleMessage(Message msg) {
				switch (msg.what) {

				// 获取验证码失败
				case CHECKCODE_STATUS_GET_FAIL:
					showToast("请重新获取验证码");
					break;

				// 解析失败
				case CHECKCODE_STATUS_PARSE_FAIL:
					showToast("解析验证码失败啦。。。");
					break;

				// 获取验证码成功
				case CHECKCODE_STATUS_OK:
					checkcodeView.setImageBitmap((Bitmap) msg.obj);
					break;

				// 登录成功
				case LOGIN_RESULT_OK:
					// String[] userInfo = (String[]) msg.obj;
					// showToast("欢迎您," + userInfo[1]);
					// // 保存简单的用户信息
					// App.setUser(new User(userInfo[0], userInfo[1]));
					
					showToast("" + msg.obj);
					redirect();
					break;

				// 验证码错误
				case LOGIN_RESULT_FAIL_CHECKCODE:
					showToast("验证码错误");
					changeCheckCode();
					break;

				// 用户名错误
				case LOGIN_RESULT_FAIL_ACCOUNT:
					showToast("不存在该用户");
					passwordText.setText("");
					changeCheckCode();
					break;

				// 密码错误
				case LOGIN_RESULT_FAIL_PASSWORD:
					showToast("密码错误");
					passwordText.setText("");
					changeCheckCode();
					break;

				// 服务器
				case LOGIN_RESULT_FAIL_SERVICE_BUSY:
					showToast("服务器繁忙");
					changeCheckCode();
					break;

				case LOGIN_RESULT_FAIL:
					showToast("登录失败,可能网络出问题了");
					changeCheckCode();
					break;
				default:
					break;
				}
			}

			/** 刷新验证码 */
			private void changeCheckCode() {
				checkcodeText.setText("");
				flushCheckCode(null);
			}

			/** 登录成功后跳转到不同界面 */
			private void redirect() {

				switch ((LoginType) getIntent().getSerializableExtra(LOGIN_TYPE_INTENT)) {

				// 跳转到教务系统的主页面
				case Jwgl:
					startActivity(JwglMain.class);
					break;

				// 跳转到失物招领页面
				case Swzl:
					break;

				// 跳转到图书馆主界面
				case Lib:
					break;

				default:
					break;
				}
				// 关闭当前登录页面
				finish();
			}

		};
	}

	/** 初始化View */
	private void initView() {
		accountText = (EditText) findViewById(R.id.et_login_jwgl_account);
		passwordText = (EditText) findViewById(R.id.et_login_jwgl_password);
		checkcodeText = (EditText) findViewById(R.id.et_login_jwgl_checkcode);
		checkcodeView = (ImageView) findViewById(R.id.iv_login_jwgl_checkcode);

		loginUserType = (RadioGroup) findViewById(R.id.rg_jwgl_login_user_type);
		loginUserType.setOnCheckedChangeListener(new OnCheckedChangeListener() {
			public void onCheckedChanged(RadioGroup group, int checkedId) {
				switch (checkedId) {
				case R.id.rb_login_jwgl_teacher:
					showToast("暂未开通教师登录功能");
					userType = "教师";
					break;

				case R.id.rb_login_jwgl_student:
					userType = "学生";
					break;

				case R.id.rb_login_jwgl_guest:
					showToast("暂未开通访客登录功能");
					userType = "访客";
					break;

				default:
					break;
				}
			}
		});

		remenberUser = (CheckBox) findViewById(R.id.cb_login_jwgl_remember_pw);
		autoLogin = (CheckBox) findViewById(R.id.cb_login_jwgl_auto_login);
	}

	/** 初始化用户登录信息 */
	private void initInfo() {
		// 如果记住了用户,则直接从配置文件中读取上次保存的信息,不保证是正确的
		if (AppUtils.getBoolFromConf(mContext, REMEMBER)) {
			accountText.setText(AppUtils.getStrFromConf(mContext, ACCOUNT));
			passwordText.setText(AppUtils.getStrFromConf(mContext, PASSWD));
		} else {
			// 不记住用户
			remenberUser.setChecked(false);
		}
	}

	/** 初始化连接 */
	private void initConn() {
		mHttpClient = HttpUtils.getHttpClient();
		// 第一次进入获取验证码
		flushCheckCode(null);
	}

	/** 重置输入框内容 */
	public void reset(View view) {
		accountText.setText("");
		passwordText.setText("");
		checkcodeText.setText("");
	}

	/** 登录 */
	public void login(View view) {
		String account = accountText.getText().toString().trim();
		String password = passwordText.getText().toString().trim();
		String checkCode = checkcodeText.getText().toString().trim();

		// 写入配置文件,保存用户名和密码
		if (remenberUser.isChecked()) {
			AppUtils.putStr2Conf(mContext, ACCOUNT, account);
			AppUtils.putStr2Conf(mContext, PASSWD, password);
			AppUtils.putBool2Conf(mContext, REMEMBER, true);
		}

		String matchResult = StringUtils.loginMatch(account, password, checkCode);
		// 不能完全匹配登录
		if (null != matchResult) {
			showToast(matchResult);
			return;
		}

		// 执行登录任务
		new LoginThread(account, password, checkCode).start();
	}

	/** 刷新获取验证码 */
	public void flushCheckCode(View view) {
		new GetCheckCodeThread().start();
	}

	/** 获取验证码线程 */
	private final class GetCheckCodeThread extends Thread implements Runnable {
		@Override
		public void run() {
			InputStream inputStream = null;
			try {
				inputStream = HttpUtils4Jwgl.getCheckCodeInputStream();
				if (null == inputStream) {
					// 获取失败了
					mHandler.sendEmptyMessage(CHECKCODE_STATUS_GET_FAIL);
				}

				// 获取到了验证码的输入流
				else {
					// 这种写法可能导致解析失败
					// Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
					byte[] data = readStream(inputStream);
					if (null != data) {
						Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
						if (null == bitmap) {
							// 解析失败
							mHandler.sendEmptyMessage(CHECKCODE_STATUS_PARSE_FAIL);
						} else {
							// 解析输入流为bitmap成功
							Message message = new Message();
							message.what = CHECKCODE_STATUS_OK;
							message.obj = bitmap; //
							mHandler.sendMessage(message);
						}
					} else {
						// 解析失败
						mHandler.sendEmptyMessage(CHECKCODE_STATUS_PARSE_FAIL);
					}
				}

			} catch (IOException e1) {
				e1.printStackTrace();
				mHandler.sendEmptyMessage(CHECKCODE_STATUS_GET_FAIL);
			}

		}

		/**
		 * 输入流转换为字节数组
		 * 
		 * @param in
		 * @return
		 * @throws IOException
		 */
		public byte[] readStream(InputStream in) throws IOException {
			ByteArrayOutputStream out = new ByteArrayOutputStream();
			// 缓冲区
			byte[] buffer = new byte[1024];
			// 每次读取字节的个数
			int len = 0;
			// 没有读到流的末尾就继续读取到缓冲区,将缓冲区的字节写到out中,直到读到流末尾,Len=-1,结束
			while ((len = in.read(buffer)) != -1) {
				out.write(buffer, 0, len);
				L.d("writing ...  " + len);
			}
			L.d("write ok ");
			in.close();
			out.close();
			return out.toByteArray();
		}

		// 文件保存
		public void save2File(byte[] data) throws IOException {
			File file = new File("/mnt/sdcard/" + DateFormat.format("yyyy-MM-dd-hh_mm_" + (int) (Math.random() * 100), System.currentTimeMillis())
					+ ".gif");
			FileOutputStream fileOutputStream = new FileOutputStream(file);
			fileOutputStream.write(data);
			fileOutputStream.flush();
			fileOutputStream.close();

		}
	}

	/** 登录线程 */
	private final class LoginThread extends Thread implements Runnable {

		String[] params;

		public LoginThread(String... params) {
			this.params = params;
		}

		@Override
		public void run() {

			try {
				int loginStatus = HttpUtils4Jwgl.login(params);
				switch (loginStatus) {
				case HttpUtils4Jwgl.LOGIN_STATUS_OK:
					login();
					break;
				case HttpUtils4Jwgl.LOGIN_STATUS_CHECKCODE_ERROR:
					mHandler.sendEmptyMessage(LOGIN_RESULT_FAIL_CHECKCODE);
					break;
				case HttpUtils4Jwgl.LOGIN_STATUS_USER_ERROR:
					mHandler.sendEmptyMessage(LOGIN_RESULT_FAIL_ACCOUNT);
					break;
				case HttpUtils4Jwgl.LOGIN_STATUS_PW_ERROR:
					mHandler.sendEmptyMessage(LOGIN_RESULT_FAIL_PASSWORD);
					break;
				case HttpUtils4Jwgl.LOGIN_STATUS_SEVICE_BUSY:
					mHandler.sendEmptyMessage(LOGIN_RESULT_FAIL_SERVICE_BUSY);
					break;

				default:
					break;
				}

			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
				mHandler.sendEmptyMessage(LOGIN_RESULT_FAIL);
			}

		}

		private void login() {
			try {
				String result = HttpUtils4Jwgl.getLoginResult(AppUtils.getStrFromConf(mContext, ACCOUNT));
				System.out.println("登陆后内容显示："+result);
				if (result.contains("退出")) {
					Message msg = new Message();
					// msg.obj = UserUtils.getUserInfo(result);
					msg.obj = UserUtils.getUserName(result);
					msg.what = LOGIN_RESULT_OK;
					mHandler.sendMessage(msg);
				} else {
					mHandler.sendEmptyMessage(LOGIN_RESULT_FAIL);
				}

			} catch (IOException e) {
				e.printStackTrace();
				mHandler.sendEmptyMessage(LOGIN_RESULT_FAIL);
			}
		}

	}

}